package com.naiterui.ehp.bs.patient.utils;

import org.apache.commons.lang3.StringUtils;

import com.naiterui.ehp.bs.patient.vo.common.LimitConfigVO;
import com.naiterui.ehp.bs.patient.vo.common.LimitValueVO;

/**
 * @author YongYang
 * @since 1.0.0
 */
public class LimitValueConfig {

    // 用药随访-回答长度
    public static final String LIMIT_VISIT_ANSWER = "limit.patientVisitAnswer";

    // 预约内容描述限制
    public static final String LIMIT_REVACATION = "limit.revacation";
    // 患者病历身高
    public static final String LIMIT_PATIENT_HEIGHT = "limit.patient.height";
    // 患者病历体重
    public static final String LIMIT_PATIENT_WEIGHT = "limit.patient.weight";
    // 患者病历，其他过敏药物史、既往病史、家族病史、遗传病
    public static final String LIMIT_DISEASE_OTHERS = "limit.disease.others";
    // 患者病历，其他酒类
    public static final String LIMIT_WINES_OTHERS = "limit.wines.others";
    // 家庭成员姓名长度限制
    public static final String LIMIT_FAMILY_NAME = "limit.family.name";

    /**
     * LimitValueConfig.validateLimit()
     * @Author YongYang
     * @Date 2016年7月21日
     * @since 1.0.0
     * @param configName
     * @param targetName
     * @return
     */
    public static boolean validateLimit(String configName, String targetName) {

        LimitConfigVO configVO = parseLimitConfig(ConfigKeyUtil.getString(configName));
        int max = null == configVO.getMax() ? 0 : configVO.getMax();
        int min = null == configVO.getMin() ? 0 : configVO.getMin();

        if (StringUtils.isBlank(targetName)) {
            return min == 0 ? true : false;
        }
        String regex = "^[\\s\\S]{" + min + "," + max + "}";

        return targetName.matches(regex);
    }

    /**
     * LimitValueConfig.getLimitConfig()
     * @Author YongYang
     * @Date 2016年7月21日
     * @since 1.0.0
     * @return
     */
    public static LimitValueVO getLimitConfig() {

        LimitValueVO totalConfigVO = new LimitValueVO();

        totalConfigVO.setVisitAnswer(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_VISIT_ANSWER)));
        totalConfigVO.setRevacation(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_REVACATION)));
        totalConfigVO.setPatientHeight(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_PATIENT_HEIGHT)));
        totalConfigVO.setPatientWeight(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_PATIENT_WEIGHT)));
        totalConfigVO.setDiseaseOthers(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_DISEASE_OTHERS)));
        totalConfigVO.setWinesOthers(parseLimitConfig(ConfigKeyUtil.getString(LIMIT_WINES_OTHERS)));
        return totalConfigVO;
    }

    /**
     * LimitValueConfig.parseLimitConfig()
     * @Author YongYang
     * @Date 2016年7月21日
     * @since 1.0.0
     * @param configValue
     * @return
     */
    private static LimitConfigVO parseLimitConfig(String configValue) {

        if (StringUtils.isBlank(configValue)) {
            return new LimitConfigVO();
        }
        String[] configs = configValue.split(",");
        Integer max = Integer.valueOf(configs[0].trim());
        Integer min = Integer.valueOf(configs[1].trim());
        Integer def = configs.length > 2 ? Integer.valueOf(configs[2].trim()) : null;
        return new LimitConfigVO(max, min, def);
    }

}
